const { OPERATION_IS_NOT_ALLOWED } = require("../config/error.constants")
const { checkMoment, checkResouce } = require("../service/permission.service")

// 只能验证登入的用户是否由操作 moment 的权限，封装一个可以验证多种数据的权限
// const verifyMomentPermission = async (ctx, next) => {
//   // 1. 获取登入用户的id / 获取将要修改动态的id
//   const { momentId } = ctx.params
//   const { id } = ctx.user

//   // 2.查询 user的id 是否有权限修改 momentId的权限
//   // 就是前端穿过来的id，通过查询语句查询是否存在这样的数据
//   const isPermission = await checkMoment(momentId, id)
//   if (!isPermission) {
//     return ctx.app.emit("error", OPERATION_IS_NOT_ALLOWED, ctx)
//   }

//   // 3. 有权限就执行下一个中间件
//   await next()
// }

// 这个验证就比较具有通用性，moment/user/comment/label 都可以直接操作，就是命名方面 momentId 要这种格式
const verifyPermission = async (ctx, next) => {
  // 1. 获取登入用户的 id
  const { id } = ctx.user

  // 2. 获取资源的 name/id
  // name => moment/user/comment/label
  // params: { momentId: 4 }
  // keyName => momentId
  const keyName = Object.keys(ctx.params)[0]
  const resourceId = ctx.params[keyName]
  const resourceName = keyName.replace("Id", "")

  // 可以在这里先查询一下，看看存不存在该资源，不存在即返回对应的错误

  // 2.查询 user的id 是否有权限修改 资源的权限
  // 就是前端穿过来的id，通过查询语句查询是否存在这样的数据
  const isPermission = await checkResouce(resourceName, resourceId, id)
  if (!isPermission) {
    return ctx.app.emit("error", OPERATION_IS_NOT_ALLOWED, ctx)
  }

  // 3. 有权限就执行下一个中间件
  await next()
}

module.exports = verifyPermission
